Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [ Vbasic.Net ] Estrapolare stringhe da un File.txt
Forum - C# / VB.NET - [ Vbasic.Net ] Estrapolare stringhe da un File.txt

Avatar
Ultimo (Member)
Guru


Messaggi: 891
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 13:05
Lunedì, 12/09/2011
Sto cercando di estrapolare i dati presenti in un file.txt (storico01-oggi.txt)  il  quale è un archivio estrazioni del lotto che scarico dal sito www.lottomaticaitalia.it

Quì sotto ho inserito un pezzo dell'archivio in formato testo :

2001/01/03    BA    26    59    60    67    17                                          
2001/01/03    CA    13    83    16    41    68                                          
2001/01/03    FI    33    87    76    7    10                                          
2001/01/03    GE    5    38    3    65    72                                            
2001/01/03    MI    62    30    7    61    52                                          
2001/01/03    NA    25    38    15    31    86                                          
2001/01/03    PA    15    56    89    85    63                                          
2001/01/03    RM    41    17    80    48    9                                          
2001/01/03    TO    42    16    12    60    20                                          
2001/01/03    VE    51    84    76    42    90                                          
2001/01/08    BA    84    80    40    15    9                                          
2001/01/08    CA    6    87    80    25    60                                          
2001/01/08    FI    72    68    79    84    88                                          
2001/01/08    GE    38    54    67    3    81                                          
2001/01/08    MI    61    1    16    31    56                                          
2001/01/08    NA    19    43    29    61    34                                          
2001/01/08    PA    16    15    66    1    44                                          
2001/01/08    RM    69    77    42    53    27                                          
2001/01/08    TO    90    50    20    59    3                                          
2001/01/08    VE    59    69    72    60    70                                          
2001/01/10    BA    14    87    29    75    76                                          
2001/01/10    CA    86    13    31    82    84                                          
2001/01/10    FI    76    83    63    84    27                                          
2001/01/10    GE    9    49    68    47    70                                          
2001/01/10    MI    35    58    31    30    79                                          
2001/01/10    NA    31    55    72    54    11                                          
2001/01/10    PA    30    58    87    43    16                                          
2001/01/10    RM    8    33    37    61    15                                          
2001/01/10    TO    89    51    10    70    84                                          
2001/01/10    VE    75    53    38    65    27                                          
2001/01/13    BA    57    64    32    84    18                                          
2001/01/13    CA    66    4    78    68    3                                            
2001/01/13    FI    44    76    77    12    35                                          
2001/01/13    GE    63    19    60    68    76                                          
2001/01/13    MI    50    46    69    34    2                                          
2001/01/13    NA    81    35    29    41    86                                          
2001/01/13    PA    90    4    74    67    19                                          
2001/01/13    RM    83    75    31    32    2                                          
2001/01/13    TO    87    52    53    45    40                                          
2001/01/13    VE    5    55    64    65    28

Quì sotto inserisco la funzione che sto cercando di implementare per estrapolare i dati separati, in modo da poterci lavorare in seguito:

Codice sorgente - presumibilmente VB.NET

  1. 'Funzione che esegue la lettura e il caricamento dell'Archivio estrazioni in formato testo.
  2.     Public Sub Carica_Archivio_Estrazioni(ByVal Ruota As String)
  3.  
  4.         'Aggiungi l'OpenFileDialog
  5.         Dim Open As New OpenFileDialog
  6.         'metti il formato
  7.         Open.Filter = " Files di Testo|*.txt"
  8.         'Metti che si apre l'OpenFileDialog e apra
  9.         If Open.ShowDialog = Windows.Forms.DialogResult.OK Then
  10.             Dim lettura As New IO.StreamReader(Open.FileName)
  11.             'Cancello ListaArchivio
  12.             LstArchivio.Clear()
  13.             'Una stringa che rappresenta ogni singola riga del file
  14.             Dim Riga As String
  15.             ' Variabile contatore
  16.             Dim Conta As Int16 = -1
  17.             'Imposta il testo della label di stato
  18.             LabelAvvisi.Text = "Apertura del file in corso..."
  19.             'Fa rispettare l'ordine delle istruzioni
  20.             Application.DoEvents()
  21.             'Attende 3 secondi
  22.             Thread.Sleep(3000)
  23.             'Fa rispettare l'ordine delle istruzioni
  24.             Application.DoEvents()
  25.             'Finchè non si raggiunge la fine del file si continua
  26.             'a leggere
  27.             While Not lettura.EndOfStream
  28.                 'Leggiamo una linea di file (S)
  29.                 Riga = lettura.ReadLine
  30.                 'Se la linea è diversa da una riga vuota
  31.                 If Riga <> Nothing Then
  32.                     ' Incremento contatore
  33.                     Conta += 1
  34.                     'Splitto la riga
  35.                     Dim vettore_riga() As String
  36.                     vettore_riga = Riga.Split(" ")
  37.                     'Carico le ListeColonne degli elementi splittati
  38.                     DataArchivio(Conta) = vettore_riga(0) ' Quì mi da errore
  39.                     RuoteArchivio(Conta) = vettore_riga(1)
  40.                     PrimoEstr(Conta) = vettore_riga(2)
  41.                     SecondoEstr(Conta) = vettore_riga(3)
  42.                     TerzoEstr(Conta) = vettore_riga(4)
  43.                     QuartoEstr(Conta) = vettore_riga(5)
  44.                     QuintoEstr(Conta) = vettore_riga(6)
  45.                     'Carico la ListaArchivio
  46.                     LstArchivio.Add(Riga)
  47.                 End If
  48.  
  49.             End While
  50.             'Chiude il file
  51.             lettura.Close()
  52.             LabelAvvisi.Text = "File aperto, righe combinazioni lette = " & Conta + 1
  53.             Me.TextBoxDataEstrazione.Text = DataArchivio(Conta)
  54.         End If
  55.  
  56.  
  57.     End Sub

  


  In pratica devo caricare degli Array o liste separati per ogni dato, come se
fossero le colonne di un database.

Questa parte di codice non so se sia corretta, per separare le sottostrighe
di ogni riga letta:

Codice sorgente - presumibilmente C# / VB.NET

  1. 'Splitto la riga
  2.                     Dim vettore_riga() As String
  3.                     vettore_riga = Riga.Split(" ")
  4.                     'Carico le ListeColonne degli elementi splittati
  5.                     DataArchivio(Conta) = vettore_riga(0) ' Quì mi da errore
  6.                     RuoteArchivio(Conta) = vettore_riga(1)
  7.                      PrimoEstr(Conta) = vettore_riga(2)
  8.                     SecondoEstr(Conta) = vettore_riga(3)
  9.                     TerzoEstr(Conta) = vettore_riga(4)
  10.                     QuartoEstr(Conta) = vettore_riga(5)
  11.                     QuintoEstr(Conta) = vettore_riga(6)



Nuova versione usando le Liste:

Codice sorgente - presumibilmente VB.NET

  1. 'Splitto la riga
  2.                     Dim vettore_riga(0 To 6) As String
  3.                     vettore_riga = Riga.Split(" ")
  4.                     'Carico le ListeColonne degli elementi splittati
  5.                     DataArchivio.Add(vettore_riga(0))
  6.                     RuoteArchivio.Add(vettore_riga(1))
  7.                     PrimoEstr.Add(vettore_riga(2))
  8.                     SecondoEstr.Add(vettore_riga(3))
  9.                     TerzoEstr.Add(vettore_riga(4))
  10.                     QuartoEstr.Add(vettore_riga(5))
  11.                     QuintoEstr.Add(vettore_riga(6))



Quì sotto inserisco la versione funzionante senza l'uso della funzione Split(" ").


Codice sorgente - presumibilmente VB.NET

  1. 'Funzione che esegue la lettura e il caricamento dell'Archivio estrazioni in formato testo.
  2.     Public Sub Carica_Archivio_Estrazioni(ByVal Ruota As String)
  3.  
  4.         'Se la lista Archivio è vuota
  5.         If LstArchivio.Count < 1 Then
  6.             'Aggiungi l'OpenFileDialog
  7.             Dim Open As New OpenFileDialog
  8.             'metti il formato
  9.             Open.Filter = " Files di Testo|*.txt"
  10.             'Metti che si apre l'OpenFileDialog e apra
  11.             If Open.ShowDialog = Windows.Forms.DialogResult.OK Then
  12.                 Dim lettura As New IO.StreamReader(Open.FileName)
  13.                 'Cancello ListaArchivio
  14.                 LstArchivio.Clear()
  15.                 'Una stringa che rappresenta ogni singola riga del file
  16.                 Dim Riga As String
  17.                 ' Variabile contatore
  18.                 Dim Conta As Int16 = -1
  19.                 'Imposta il testo della label di stato
  20.                 LabelAvvisi.Text = "Apertura del file in corso..."
  21.                 'Fa rispettare l'ordine delle istruzioni
  22.                 Application.DoEvents()
  23.                 'Attende 3 secondi
  24.                 Thread.Sleep(3000)
  25.                 'Fa rispettare l'ordine delle istruzioni
  26.                 Application.DoEvents()
  27.                 'Finchè non si raggiunge la fine del file si continua
  28.                 'a leggere
  29.                 While Not lettura.EndOfStream
  30.                     'Leggiamo una linea di file (S)
  31.                     Riga = lettura.ReadLine
  32.                     'Se la linea è diversa da una riga vuota
  33.                     If (Riga Is Nothing) Or (Riga = "") Or (Riga.Length < 10) Then
  34.                         'Se la riga è vuota la salta.
  35.                     Else
  36.                         ' Incremento Conta
  37.                         Conta += 1
  38.                         Dim Carattere As String = ""
  39.                         Dim NuovaRiga As String = ""
  40.                         Dim Contatore As Int16 = 0
  41.                         'Con un ciclo For Each verifico tutti i caratteri della stringa Riga
  42.                         For Each c As Char In Riga
  43.                             If c = "    "c Or c = "     "c Then
  44.                                 Contatore += 1
  45.                             End If
  46.                             Carattere = CStr(c)
  47.                             If Carattere = " " Then
  48.                                 Contatore += 1
  49.                             End If
  50.                             If c = "    "c Or c = "     "c Or Carattere = " " Then
  51.                                 'Carico le Liste_Colonne dei dati
  52.                                 Select Case Contatore
  53.                                     Case 1
  54.                                         DataArchivio.Add(NuovaRiga)
  55.                                     Case 2
  56.                                         RuoteArchivio.Add(NuovaRiga)
  57.                                     Case 3
  58.                                         PrimoEstr.Add(NuovaRiga)
  59.                                     Case 4
  60.                                         SecondoEstr.Add(NuovaRiga)
  61.                                     Case 5
  62.                                         TerzoEstr.Add(NuovaRiga)
  63.                                     Case 6
  64.                                         QuartoEstr.Add(NuovaRiga)
  65.                                     Case 7
  66.                                         QuintoEstr.Add(NuovaRiga)
  67.                                 End Select
  68.                                 'Cancella la stringa
  69.                                 NuovaRiga = ""
  70.                             Else
  71.                                 'Forma la nuova stringa
  72.                                 NuovaRiga += Carattere
  73.                             End If
  74.                             'Ci interessano solo i primi sette Dati della stringa Riga
  75.                             If Contatore = 7 Then
  76.                                 Exit For
  77.                             End If
  78.                         Next c
  79.                         'Carico la ListaArchivio
  80.                         LstArchivio.Add(Riga)
  81.                     End If
  82.                 End While
  83.                 'Chiude il file
  84.                 lettura.Close()
  85.                 'Chiama la funzione InserisciDati
  86.                 IserisciDati(Ruota)
  87.                 LabelAvvisi.Text = "File aperto, righe combinazioni lette = " & Conta + 1
  88.                 Me.TextBoxDataEstrazione.Text = DataArchivio(Conta)
  89.             End If
  90.             'Se la Lista Archivio è già caricata
  91.         Else
  92.             'Chiama la funzione InserisciDati
  93.             IserisciDati(Ruota)
  94.         End If
  95.  
  96.     End Sub

  

Ringrazio anticipatamente per un vostro eventuale aiuto ;)

Ultima modifica effettuata da Ultimo il 14/09/2011 alle 12:38


If ok Then GOTO Avanza else GOTO Inizia

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 12:12
Martedì, 13/09/2011
Si può risolvere facilmente con poche righe di LINQ:
Codice sorgente - presumibilmente VB.NET

  1. var data =
  2.     from line in File.ReadAllLines("prof.txt")
  3.     where !String.IsNullOrEmpty(line)
  4.     let parts = from part in line.Split(' ')
  5.                 where !String.IsNullOrEmpty(part) && part != " "
  6.                 select part
  7.     select new
  8.     {
  9.         DataArchivio = parts.ElementAt(0),
  10.         RuoteArchivio = parts.ElementAt(1),
  11.         Estrazioni = parts.Skip(2).Take(5)
  12.     };


Grazie Totem, anche se sul Linq sono molto niubbo - Ultimo - 13/09/11 16:11
Non capisco perchè non mi vede gli spazi tra i numeri la ruota e la data, che sul file.txt sono evidenti - Ultimo - 13/09/11 16:16
Studiali le regex... Così per riconoscere uno spazio ti basta \s+, cioè carattere Spazio riepetuto 1 o + volte.. - Renny - 13/09/11 20:55
Ok grazie Renny sicuramente le studierò - Ultimo - 14/09/11 00:26
Non capisco cosa intendi, Ultimo. La query filtra apposta gli spazi... - Il Totem - 14/09/11 11:43
No non mi riferivo alla query, ma alla funzione Riga.Split(" "), però sono riuscito a risolvere in un altro modo, che inserisco - Ultimo - 14/09/11 12:16
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
-1
Down
V
Segnala al moderatore
Postato alle 13:18
Lunedì, 12/09/2011
E hai un problema con il tuo codice? Quale?

ho aggiunto il codice che non va - Ultimo - 12/09/11 17:43
NullReferenceException non è stata gestita, riferimento a un oggetto non impostato su un istanza di oggetto - Ultimo - 12/09/11 18:09
Sono dichiarati all'inizio, a livello globale es. Dim DataArchivio() As String - Ultimo - 12/09/11 18:20
Se usassi un Dim DataArchivio As New List(Of String) ? - Ultimo - 12/09/11 18:25
Ok grazie, però con la funzione Split() non riesco a dividere le righe correttamente, se uso Split(" ") mi da 43 elementi di cui il primo la riga intera tutta attacata e gli altri tutti Null - Ultimo - 12/09/11 18:56
Poi alla fine quando risolvo, (se risolvo ?) aggiungo la versione funzionante - Ultimo - 12/09/11 19:05
Le righe sono tutte in questa forma nel File.txt (2001/01/03 VE 51 84 76 42 90 ) senza le parentesi, in debug quando leggo la variabile Riga, vedo questo "2001/01/03 BA 26 59 60 67 17 " - Ultimo - 12/09/11 19:18
"2001/01/03 BA 26 59 60 67 17 " lettura della variabile Riga - Ultimo - 12/09/11 19:20
Quando legge la riga nella variabile Riga dopo l'ultimo numero e il doppio apice ci sono molti spazi, quando Splitta con Split(" ") mi inserisce nel vettore questi spazi null, quindi il vettore mi diventa di 43 elementi di cui 42 "", se uso Split("/") me la divide in 3 parti - Ultimo - 12/09/11 19:30
Forse con lo Split non si può fare, cosa posso usare ? - Ultimo - 12/09/11 19:41
Ma se scrivi una bella Espressione Regolare? Guarda che è Facile... Su Google trovi 1000 tutorial. Crei i tuoi gruppi di cattura e recuperi date e numeri in 2 secondi.. - Renny - 12/09/11 20:34
Bhe, ecco.. (?<Data>\d{4}\/\d\d\/\d\d)\s*(?<Città>\w\w)\s*(?<Num1>\d+)\s*(?<Num2>\d+)\s* Basta completare aggiungendo i gruppi per catturare gli altri numeri.. - Renny - 12/09/11 21:06
Espressioni regolari ? mmmm, devo ancora studiarle sono niubbo sul tema ....... - Ultimo - 13/09/11 16:08
PM